home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************/
- /* */
- /* ADOBE CONFIDENTIAL */
- /* _ _ _ _ _ _ _ _ _ _ _ _ _ */
- /* */
- /* Copyright 2002 Adobe Systems Incorporated */
- /* All Rights Reserved. */
- /* */
- /* NOTICE: All information contained herein is, and remains the */
- /* property of Adobe Systems Incorporated and its suppliers, if */
- /* any. The intellectual and technical concepts contained */
- /* herein are proprietary to Adobe Systems Incorporated and its */
- /* suppliers and may be covered by U.S. and Foreign Patents, */
- /* patents in process, and are protected by trade secret or */
- /* copyright law. Dissemination of this information or */
- /* reproduction of this material is strictly forbidden unless */
- /* prior written permission is obtained from Adobe Systems */
- /* Incorporated. */
- /* */
- /*******************************************************************/
-
- /*
- **-----------------------------------------------------------------------------
- ** Effect File Variables - HLSLRefract.fx
- **-----------------------------------------------------------------------------
- */
-
- uniform float4x4 gWorldViewProj : WorldViewProjection; // This matrix will be loaded by the application
- uniform float4x4 gWorldViewInverse;
- uniform float4x4 gWorld;
- uniform float4 gEyePosition;
- uniform float gBumpAmount;
- uniform float gRefractiveIndex;
- uniform float gRippleParameter;
- uniform float gDepth;
- texture gVideoTexture;
- texture gBumpTexture;
- const float kModelDim = 4.0f;
-
-
-
-
- /*
- **-----------------------------------------
- ** Sampler States
- **-----------------------------------------
- */
- //incoming video texture
- sampler SamplerVideo = sampler_state
- {
- Texture = (gVideoTexture);
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- BorderColor = 0x00000000;
- AddressU = BORDER;
- AddressV = BORDER;
-
- };
-
- sampler SamplerBump = sampler_state
- {
- Texture = (gBumpTexture);
- MipFilter = LINEAR;
- MinFilter = LINEAR;
- MagFilter = LINEAR;
- };
-
- /*
- **-----------------------------------------------------------------------------
- ** Vertex Definitions
- **-----------------------------------------------------------------------------
- ** APP_OUTPUT is the structure in which we receive the vertices from the application
- */
- struct APP_OUTPUT
- {
- float3 mPosition : POSITION;
- float3 mNormal : NORMAL;
- float2 mTexCoord : TEXCOORD0;
-
- };
-
- /*
- ** Pixel Shader structure declaration
- */
-
- struct REF_VS_OUTPUT
- {
- float4 mPosition :POSITION;
- float2 mTexcoord :TEXCOORD0;
- float3 mPositionT :TEXCOORD1;
- float3 mIncidentVectorT :TEXCOORD2;
- float3 mBacktexS :TEXCOORD3;
- float3 mBacktexT :TEXCOORD4;
- };
-
- struct REF_PS_OUTPUT
- {
- float4 mColor : COLOR;
- };
-
- struct TEMP_OUT
- {
- float4 mPosition : POSITION;
- float3 mNormal : NORMAL0;
- float3 mTangent;
- float3 mBinormal;
- };
-
- /*
- **------------------------------------------------
- ** Ripple effect
- **------------------------------------------------
- */
- TEMP_OUT MakeRipple( float3 position, uniform float param )
- {
- TEMP_OUT returnVertex;
- float sinVal, dist = 0;
-
- dist = distance ( position, float3( 0.0, 0.0, 0.1) );
-
- sinVal = sin((dist+param)*25);
-
- returnVertex.mPosition = float4(position.x,
- position.y,
- position.z,
- 1.0f );
-
- returnVertex.mTangent = normalize( float3( 1.0, 0, param*0.10*sinVal*position.x/dist) );
- returnVertex.mBinormal= normalize( float3( 0, 1.0, param*0.10*sinVal*position.y/dist) );
- returnVertex.mNormal = cross( returnVertex.mTangent, returnVertex.mBinormal );
-
- return returnVertex;
- }
-
-
- /*
- **------------------------------------------------
- ** my_refract function
- **------------------------------------------------
- */
-
- float3 my_refract( float3 I, float3 N, float eta )
- {
- return I + eta*(-N-I);
- }
-
-
- /*
- **------------------------------------------------
- ** Glass vertex shader
- **------------------------------------------------
- */
- REF_VS_OUTPUT rect_vs( APP_OUTPUT IN )
- {
- REF_VS_OUTPUT OUT;
-
- TEMP_OUT tempVtx = MakeRipple( IN.mPosition, gRippleParameter );
-
- // transform vertex position into homogenous clip-space
- OUT.mPosition = mul(gWorldViewProj, (tempVtx.mPosition) );
-
- // copy texture coordinates
- OUT.mTexcoord.xy = IN.mTexCoord.xy;
-
- float3x3 stspacemat = float3x3(tempVtx.mTangent,tempVtx.mBinormal,tempVtx.mNormal);
-
- //compute positon and normal in world space
- float3 positionW = mul(gWorld,tempVtx.mPosition);
-
- //compute the incident vector(in world space)- and transform to texture space
- float3 incidentVectorW = positionW - gEyePosition;
- incidentVectorW = normalize(incidentVectorW);
- OUT.mIncidentVectorT=mul(stspacemat,mul(gWorldViewInverse,incidentVectorW));
- OUT.mIncidentVectorT = normalize( OUT.mIncidentVectorT );
-
- //carrying fwd the positionW in texturespace
- OUT.mPositionT =mul(stspacemat,tempVtx.mPosition);
-
- OUT.mBacktexS = mul(stspacemat,float3(1.0f,0.0,0.0));
- OUT.mBacktexT = mul(stspacemat,float3(0.0,1.0f,0.0));
-
- return OUT;
- }
-
-
- REF_VS_OUTPUT rect_vs_1_3( APP_OUTPUT IN )
- {
- REF_VS_OUTPUT OUT;
-
- TEMP_OUT tempVtx = MakeRipple( IN.mPosition, gRippleParameter );
-
- // transform vertex position into homogenous clip-space
- OUT.mPosition = mul(gWorldViewProj, (tempVtx.mPosition) );
-
- float3x3 stspacemat = float3x3(tempVtx.mTangent,tempVtx.mBinormal,tempVtx.mNormal);
-
- //compute positon and normal in world space
- float3 positionW = mul(gWorld,tempVtx.mPosition);
-
- //compute the incident vector(in world space)- and transform to texture space
- float3 incidentVectorW = positionW - gEyePosition;
- incidentVectorW = normalize(incidentVectorW);
- OUT.mIncidentVectorT=mul(stspacemat,mul(gWorldViewInverse,incidentVectorW));
- OUT.mIncidentVectorT = normalize( OUT.mIncidentVectorT );
-
- //carrying fwd the positionW in texturespace
- OUT.mPositionT =mul(stspacemat,tempVtx.mPosition);
-
- OUT.mBacktexS = mul(stspacemat,float3(1.0f,0.0,0.0));
- OUT.mBacktexT = mul(stspacemat,float3(0.0,1.0f,0.0));
-
- float3 refractedVectorT =my_refract(OUT.mIncidentVectorT, float3(0.0, 0.0, 1.0), gRefractiveIndex );
-
- float3 pointOnBackTextureT;
- pointOnBackTextureT = gDepth*refractedVectorT + OUT.mPositionT;
-
- OUT.mTexcoord.x = dot(OUT.mBacktexS, pointOnBackTextureT);
- OUT.mTexcoord.y = dot(OUT.mBacktexT, pointOnBackTextureT);
-
- return OUT;
- }
-
-
- /*
- **------------------------------------------------
- ** Glass pixel shader 2.0
- **------------------------------------------------
- */
- REF_PS_OUTPUT rect_ps_2_0( REF_VS_OUTPUT IN )
- {
- REF_PS_OUTPUT OUT;
-
- //compute local normals - in texture (s&t) space
- float3 localNormalT;
- localNormalT = tex2D( SamplerBump, IN.mTexcoord ).xyz;
- localNormalT = 2*(localNormalT - 0.5);
-
- localNormalT=lerp(float3(0.0f,0.0f,1.0f),localNormalT,gBumpAmount);
-
- //find the refracted vector in TextureSpace
- float3 refractedVectorT =my_refract(IN.mIncidentVectorT, localNormalT, gRefractiveIndex );
-
- //locate intersection with back surface
- float3 pointOnBackTextureT;
- pointOnBackTextureT = gDepth*refractedVectorT + IN.mPositionT;
-
- float2 lookupPoint;
- lookupPoint.x = dot(IN.mBacktexS, pointOnBackTextureT);
- lookupPoint.y = dot(IN.mBacktexT, pointOnBackTextureT);
-
- OUT.mColor = tex2D( SamplerVideo,lookupPoint);
-
- return OUT;
- }
-
-
- /*
- **------------------------------------------------
- ** Glass pixel shader 1.4
- **------------------------------------------------
- */
- REF_PS_OUTPUT rect_ps_1_4( REF_VS_OUTPUT IN )
- {
- REF_PS_OUTPUT OUT;
-
- //compute local normals - in texture (s&t) space
- float3 localNormalT;
- localNormalT = tex2D( SamplerBump, IN.mTexcoord ).xyz;
- localNormalT = 2*(localNormalT - 0.5)*gBumpAmount; //normal is in s&t space
-
- //find the refracted vector in TextureSpace
- float3 refractedVectorT =my_refract(IN.mIncidentVectorT, localNormalT, gRefractiveIndex );
-
- //locate intersection with back surface
- float3 pointOnBackTextureT;
- pointOnBackTextureT = gDepth*refractedVectorT + IN.mPositionT;
-
- float2 lookupPoint;
- lookupPoint.x = dot(IN.mBacktexS, pointOnBackTextureT);
- lookupPoint.y = dot(IN.mBacktexT, pointOnBackTextureT);
-
- OUT.mColor = tex2D( SamplerVideo, lookupPoint);
-
- return OUT;
- }
-
- REF_PS_OUTPUT rect_ps_1_3( REF_VS_OUTPUT IN )
- {
- REF_PS_OUTPUT OUT;
-
- OUT.mColor = tex2D( SamplerVideo, IN.mTexcoord );
-
- return OUT;
- }
-
-
- /*
- **----------------------------------------------------------
- ** Technique with one pass [TODO] add pass for ps_1_4
- **----------------------------------------------------------
- */
-
-
- technique refract_2_0
- {
- pass Pass0 //for the rectangular glass piece
- {
- Sampler[0] = (SamplerVideo);
- Sampler[1] = (SamplerBump);
-
- VertexShader = compile vs_2_0 rect_vs();
- PixelShader = compile ps_2_0 rect_ps_2_0();
-
- }
-
- }
-
-
-
- technique refract_1_4
- {
- pass Pass0 //for the rectangular glass piece
- {
- Sampler[0] = (SamplerVideo);
- Sampler[1] = (SamplerBump);
-
- VertexShader = compile vs_1_1 rect_vs();
- PixelShader = compile ps_1_4 rect_ps_1_4();
-
- }
-
- }
-
- technique refract_1_3
- {
- pass Pass0 //for the rectangular glass piece
- {
- Sampler[0] = (SamplerVideo);
-
- VertexShader = compile vs_1_1 rect_vs_1_3();
- PixelShader = compile ps_1_3 rect_ps_1_3();
-
- }
-
- }
-